import tkinter
import tkinter.filedialog
import tkinter.messagebox
import os
from PIL import Image, ImageGrab
from time import sleep

root = tkinter.Tk()
root.geometry('100x40+400+300')
root.resizable(False, False)

class MyCapture:
    def __init__(self, png):
        self.X = tkinter.IntVar(value=0)
        self.Y = tkinter.IntVar(value=0)

        screenWidth = root.winfo_screenwidth()
        screenHeight = root.winfo_screenheight()

        self.top = tkinter.Toplevel(root, width=screenWidth, height=screenHeight)
        self.top.overrideredirect(True)
        self.canvas = tkinter.Canvas(self.top, bg='white', width=screenWidth, height=screenHeight)

        self.image = tkinter.PhotoImage(file=png)  # 注意：这里应该使用有效的图片路径
        self.canvas.create_image(screenWidth//2, screenHeight//2, image=self.image)

        def onLeftButtonDown(event):
            # 这里我们不需要重新打开图片，因为我们只是想要获取屏幕上的颜色
            # im = Image.open(png)  # 这行是多余的
            x, y = self.canvas.canvasx(event.x), self.canvas.canvasy(event.y)  # 将屏幕坐标转换为画布坐标
            # 由于我们没有实际的图片在画布上（只是显示了一个PhotoImage），我们不能直接从画布获取像素
            # 但由于我们想要捕获屏幕颜色，我们可以使用ImageGrab来捕获屏幕上的颜色
            screen_im = ImageGrab.grab()
            color = screen_im.getpixel((x, y))[:3]  # 获取RGB颜色
            msg = str(color) + '\n'
            color_hex = '#'+''.join(map(lambda x: format(x, '02x'), color))  # 将RGB转换为十六进制颜色代码
            msg += color_hex
            tkinter.messagebox.showinfo('', msg)

            self.top.destroy()

        self.canvas.pack(fill=tkinter.BOTH, expand=tkinter.YES)
        self.canvas.bind('<Button-1>', onLeftButtonDown)  # 应该是按下按钮时触发，而不是释放时

def buttonCaptureClick():
    root.iconify()  # 最小化窗口
    sleep(0.2)  # 等待0.2秒以确保窗口最小化

    filename = 'temp.png'
    im = ImageGrab.grab()  # 捕获屏幕
    im.save(filename)  # 保存为PNG文件
    # im.save(filname)  # 这行是重复的，而且filname拼写错误
    # im.close  # 这应该是im.close()，但在这里我们不需要关闭它，因为文件已经保存

    w = MyCapture(filename)  # 创建MyCapture实例
    w.top.wait_window()  # 等待窗口关闭（注意是w.top，不是buttonCapture）
    root.deiconify()  # 恢复窗口
    os.remove(filename)  # 删除临时文件

buttonCapture = tkinter.Button(root, text='取色', command=buttonCaptureClick)
buttonCapture.pack(padx=10, pady=10, side=tkinter.LEFT)  # 使用padx和pady代替x和y，side代替pack的位置参数

root.mainloop()